home *** CD-ROM | disk | FTP | other *** search
-
- /***************************************************************************
-
- XAPPLE.C
-
- - Apple ][ service routines
-
- 01/26/88 created
- 03/03/88 Laser C
-
- 07/24/88 21:45
-
- ***************************************************************************/
-
- #include <stdio.h>
- #include <osbind.h>
- #include "xglobal.h"
- #include "x6502.h"
-
- #define GRAPHICS 1
- #define TEXT 2
- #define FULLGRAF 4
- #define SPLITSCR 8
- #define PAGE1 16
- #define PAGE2 32
- #define LORES 64
- #define HIRES 128
-
- extern
- rsA00(), rsA01(), rsA02(), rsA03(), rsA04(), rsA05(), rsA06(), rsA07(),
- rsA08(), rsA09(), rsA0A(), rsA0B(), rsA0C(), rsA0D(), rsA0E(), rsA0F();
-
- extern
- wsA00(), wsA01(), wsA02(), wsA03(), wsA04(), wsA05(), wsA06(), wsA07(),
- wsA08(), wsA09(), wsA0A(), wsA0B(), wsA0C(), wsA0D(), wsA0E(), wsA0F();
-
- extern rsAXX(), wsAXX();
- extern TextPlotApple();
- extern LAmpEaX(), LAmpEaY(), LAfont();
- extern Lmp8to16();
- extern Apple_Hook();
- extern mpSTtoAp();
- extern ApOldKey();
- extern ApKeyPatch();
- extern LAppleVBI();
-
- extern int rgwAtColors[16];
-
- /* array of pointers to 256 service routines */
- void (*Aread_service[17])() =
- {
- rsA00, rsA01, rsA02, rsA03, rsA04, rsA05, rsA06, rsA07,
- rsA08, rsA09, rsA0A, rsA0B, rsA0C, rsA0D, rsA0E, rsA0F, rsAXX
- };
-
- void (*Awrite_service[17])() =
- {
- wsA00, wsA01, wsA02, wsA03, wsA04, wsA05, wsA06, wsA07,
- wsA08, wsA09, wsA0A, wsA0B, wsA0C, wsA0D, wsA0E, wsA0F, wsAXX
- };
-
- int baddr1[25] =
- {
- 0, 1280, 2560, 3840, 5120, 6400, 7680, 8960,
- 10240, 11520, 12800, 14080, 15360, 16640, 17920, 19200, 20480,
- 21760, 23040, 24320, 25600, 26880, 28160, 29440, 30720
- };
-
- int baddr2[25] =
- {
- 0, 640, 1280, 1920, 2560, 3200, 3840, 4480, 5120, 5760, 6400, 7040,
- 7680, 8320, 8960, 9600, 10240, 10880, 11520, 12160, 12800, 13440, 14080,
- 14720, 15360
- };
-
- extern char b484Sav;
-
- /* This hooks all the interrupt vectors and also does anything that should
- ** be done, like clearing console keys, etc.
- */
-
- Apple_Hook()
- {
-
- #ifdef NDEBUG
- printf("Apple_Hook()\n");
- #endif
-
- b484Sav = *(char *)0x0484L;
- *(char*)0x0484L &= ~3; /* disable keyclick */
-
- VBI_on(LAppleVBI);
- ApInstKey();
-
- Setpalette(rgwAtColors);
- }
-
- Apple_Unhook()
- {
- ApRemoveKey();
- VBI_off();
- *(char*)0x0484L = b484Sav; /* enable keyclick */
-
- Setpalette(rgwPalette);
-
- #ifdef NDEBUG
- printf("Apple_UnHook()\n");
- #endif
- }
-
- ApInstKey()
- {
- register long *qKbdvBase;
-
- qKbdvBase = (long *) Kbdvbase();
-
- asm
- {
- ; turn off mouse = Bconout(4,$12)
- move.w #0x12,-(A7)
- move.w #4,-(A7)
- move.w #3,-(A7)
- trap #13
- addq.l #6,A7
-
- ; get old keyboard vector
- move.l 32(qKbdvBase),ApOldKey
- lea ApKeyPatch,A1
- move.l A1,32(qKbdvBase)
-
- ; turn on joysticks = Bconout(4,$14)
- ; move.w #0x14,-(A7)
- ; move.w #4,-(A7)
- ; move.w #3,-(A7)
- ; trap #13
- ; addq.l #6,A7
- }
- }
-
- ApRemoveKey()
- {
- register long *qKbdvBase;
-
- qKbdvBase = (long *)Kbdvbase();
-
- asm {
- ; turn off joysticks = Bconout(4,$1A)
- ; move.w #0x1a,-(A7)
- ; move.w #4,-(A7)
- ; move.w #3,-(A7)
- ; trap #13
- ; addq.l #6,A7
-
- move.l ApOldKey,32(qKbdvBase) ; recover the old keyboard vector
-
- ; turn on mouse = Bconout(4,$8)
- move.w #0x8,-(A7)
- move.w #4,-(A7)
- move.w #3,-(A7)
- trap #13
- addq.l #6,A7
- }
- }
-
- /* initialize the stat arrays and set defaults for power on */
- setup_apple()
- {
- register unsigned ea;
- register int x,y;
- register char *qRStat = (char *)lRStat;
- register char *qWStat = (char *)lWStat;
-
- /* clear out stat arrays */
- Blitzl(lRStat - 32768L, 8192);
- Blitzl(lWStat - 32768L, 16384);
-
- /* clear out screen */
- Blitzl(lScr, 10240);
-
- /* clear out RAM */
- Blitc(0xAA, lMemory, 0xC000);
-
- /* write-protect ROM */
- Blitb(lScratch, lMemory + (unsigned)0xD000, 12288);
- Blitc(1+128, &qWStat[0xFFFFC000], 16384);
-
- rgwAtColors[0] = 0;
- rgwAtColors[1] = 0x666;
- rgwAtColors[2] = 0x666;
- rgwAtColors[3] = 0x666;
-
- /* text page 1 */
- for (ea=1024; ea<2048; ea++)
- {
- if ((ea&0x7F) < 120)
- qWStat[ea]=2+128;
- }
-
- qRStat[0xFFFFC000] = 8; /* keyboard register */
- qRStat[0xFFFFC010] = 9; /* keyboard strobe */
-
- qWStat[0xFFFFC030] = 10+128; /* speaker */
-
- {
- int iHeap = 0;
- long lToRS, lToWS;
- long lFromRS, lFromWS, lNextRS, lNextWS;
- int iService = 0;
-
- /* blit the 16 read and 16 write routines */
- do
- {
- lToRS = lEmul + iHeap + (int)iRead;
- lFromRS = (long)Aread_service[iService];
- lNextRS = (long)Aread_service[iService+1];
-
- lToWS = lEmul + iHeap + (int)iWrite;
- lFromWS = (long)Awrite_service[iService];
- lNextWS = (long)Awrite_service[iService+1];
-
- Assert(((int)(lNextRS - lFromRS)) >= 0, "RS blitting negative");
- Assert(((int)(lNextRS - lFromRS)) != 0, "RS blitting 0");
- Assert(((int)(lNextRS - lFromRS)) < 64, "RS blitting >64");
-
- Blitb(lFromRS, lToRS, (int)(lNextRS - lFromRS));
- Blitb(lFromWS, lToWS, (int)(lNextWS - lFromWS));
-
- iHeap += 256;
- iService++;
- } while (iService != 16);
- }
- *(long *)(lEmul + (Jump0)) = (long)TextPlotApple;
-
- /* set initial SP = $FF */
- PutReg('SP',0xFF);
-
- /* to save time when plotting, generate Apple font and x,y info */
-
- qRStat = (char *)LAmpEaX;
- qWStat = (char *)LAmpEaY;
- for (ea=0; ea<1024; ea++)
- {
- qWStat[ea] = (((ea&0x7F)/40)<<3) + (ea>>7); /* screen row */
- qRStat[ea] = (ea&0x7F)%40; /* screen column */
- }
-
- /* 0-63 = inverse of 32-96 ??
- 64-127 = flashing of same thing
- 128-255 = normal
- */
-
- qRStat = (char *)lFont8;
- qWStat = (char *)LAfont;
- for (ea=0; ea<256; ea++)
- {
- x = ea & 0x7F;
- if (x<32)
- x += 64;
- else if ((ea >= 96) && (ea < 128))
- x -= 64;
- for (y=0; y<2048; y+= 256)
- {
- *qWStat++ = qRStat[x+y] ^ ((ea & 0x80) ? 0 : ~0);
- }
- }
-
- pHookIn = Apple_Hook;
- pUnHook = Apple_Unhook;
- }
-
- /* End of init code */
-
-
- TextPlotApple(text,loc)
- register int text;
- register int loc;
- {
- register int scrx, scry;
- register char *qbFont = (char *)LAfont;
- register char *qbScr = (char *)(lScr+3840L);
- register char *qmp816 = (char *)Lmp8to16; /* mono only */
-
- #ifdef NDEBUG
- printf("ApplePlot(): loc = %d value = %d\n", loc, text);
- #endif
-
- loc &= 1023;
- scrx = *((char *)LAmpEaX + loc);
- scry = *((char *)LAmpEaY + loc);
-
- qbFont += (text << 3);
-
- if (fIsMono)
- goto lPlotAtTextMono;
-
- asm
- {
- move.w scrx,D0 ; do funny bit field gyrations
- andi.w #~1,D0
- add.w D0,D0
- add.w D0,D0
- andi.w #1,scrx
- or.w D0,scrx
- }
-
- qbScr += baddr1[scry] + scrx;
-
- asm
- {
- move.b (qbFont)+,D0
- move.b D0,(qbScr)
- move.b D0,2(qbScr)
- sf 4(qbScr)
- sf 6(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,160(qbScr)
- move.b D0,162(qbScr)
- sf 164(qbScr)
- sf 166(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,320(qbScr)
- move.b D0,322(qbScr)
- sf 324(qbScr)
- sf 326(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,480(qbScr)
- move.b D0,482(qbScr)
- sf 484(qbScr)
- sf 486(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,640(qbScr)
- move.b D0,642(qbScr)
- sf 644(qbScr)
- sf 646(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,800(qbScr)
- move.b D0,802(qbScr)
- sf 804(qbScr)
- sf 806(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,960(qbScr)
- move.b D0,962(qbScr)
- sf 964(qbScr)
- sf 966(qbScr)
-
- move.b (qbFont)+,D0
- move.b D0,1120(qbScr)
- move.b D0,1122(qbScr)
- sf 1124(qbScr)
- sf 1126(qbScr)
- }
- return;
-
- lPlotAtTextMono:
- qbScr += baddr1[scry] + scrx + scrx;
-
- asm
- {
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,(qbScr)
- move.w D0,80(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,160(qbScr)
- move.w D0,240(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,320(qbScr)
- move.w D0,400(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,480(qbScr)
- move.w D0,560(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,640(qbScr)
- move.w D0,720(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,800(qbScr)
- move.w D0,880(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,960(qbScr)
- move.w D0,1040(qbScr)
-
- clr.w D0
- move.b (qbFont)+,D0
- add.w D0,D0
- move.w 0(qmp816,D0),D0
- move.w D0,1120(qbScr)
- move.w D0,1200(qbScr)
- }
- }
-
-
- apple()
- {
- asm {
-
- LAmpEaX:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- LAmpEaY:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- LAfont:
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
- dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- wsA00:
- nop ; this is just a dummy
- DISPATCH
-
- ; handler for ROM, do nothing
- wsA01:
- addq.l #2,SP
- DISPATCH
-
- ; handler for text page 1
- wsA02:
- move.w (SP)+,drDATA
- move.l drEA,arEA
- cmp.b (arEA),drDATA ; check if byte we're storing is already there
- beq.s wsA02X ; if so, no need to plot the character
-
- move.b drDATA,(arEA) ; else, store new character and plot it
- SAVEREGS
- move.w drEA,-(SP)
- move.w drDATA,-(SP)
- move.l Jump0(arEMUL),A0
- jsr (A0) ; call TextPlotApple(drDATA,drEA)
- addq.l #4,SP
- LOADREGS
- wsA02X:
- DISPATCH
-
- wsA03:
- addq.l #2,SP
- DISPATCH
- wsA04:
- addq.l #2,SP
- DISPATCH
- wsA05:
- addq.l #2,SP
- DISPATCH
- wsA06:
- addq.l #2,SP
- DISPATCH
- wsA07:
- addq.l #2,SP
- DISPATCH
- wsA08:
- addq.l #2,SP
- DISPATCH
- wsA09:
- addq.l #2,SP
- DISPATCH
- wsA0A:
- addq.l #2,SP
- DISPATCH
- wsA0B:
- addq.l #2,SP
- DISPATCH
- wsA0C:
- addq.l #2,SP
- DISPATCH
- wsA0D:
- addq.l #2,SP
- DISPATCH
- wsA0E:
- addq.l #2,SP
- DISPATCH
- wsA0F:
- addq.l #2,SP
- DISPATCH
- wsAXX:
- addq.l #2,SP
- DISPATCH
-
- rsA00:
- rts
- rsA01:
- rts
- rsA02:
- rts
- rsA03:
- rts
- rsA04:
- rts
- rsA05:
- rts
- rsA06:
- rts
- rsA07:
- rts
-
- ; read $C000, the Apple's keyboard register
- rsA08:
- movem.l D1-D7/A0-A2,-(SP) ; must save A0, A1, A2 before a TRAP
-
- move.w #2,-(SP)
- move.w #1,-(SP)
- trap #13 ; Bconstat(2)
- addq.l #4,(SP)+
-
- tst.w D0 ; is there a key ready?
- bne.s rsA082 ; yes
- movem.l (SP)+,D1-D7/A0-A2 ; else just exit
- rts
-
- rsA082:
- move.w #2,-(SP)
- move.w #2,-(SP)
- trap #13 ; Bconin(2)
- addq.l #4,(SP)+
-
- andi.w #0x00FF,drDATA
- beq.s rsA082_x ; ignore function and cursor keys
-
- lea mpSTtoAp,arEA
- move.b 0(arEA,drDATA.w),drDATA
- move.l drEA,arEA
- move.b drDATA,(arEA) ; store character code
- rsA082_x:
- movem.l (SP)+,D1-D7/A0-A2
- rts
-
- ; Apple's keyboard strobe, clears the high bit of $C000
- rsA09:
- move.w #0xC000,drEA
- move.l drEA,arEA
- andi.b #0x7F,(arEA) ; clear high bit of $C000
- rts
-
- rsA0A:
- rts
- rsA0B:
- rts
- rsA0C:
- rts
- rsA0D:
- rts
- rsA0E:
- rts
- rsA0F:
- rts
- rsAXX:
- rts
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ; This is the Apple VBI routine
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- #ifdef DEBUG
- dc.w 'Ap', 'pl', 'eV', 'BI', 0
- #endif
-
- Lmod:
- dc.w 0
-
- LAppleVBI:
- ; move.w wVBIcount,D0
- ; cmp.w wVBIrate,D0
- ; bne LApVBIexit ; skip wVBIrate VBI's
-
- ; clr.w wVBIcount
-
- LApVBIexit:
- rts
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;
- ; Keyboard handler to map the ST scan code to an 8 bit internal scan code.
- ;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- ; some safety room
- dc.w 0
-
- #ifdef DEBUG
- dc.w 'Ap', 'Ke', 'yP', 'at', 'ch', 0
- #endif
-
- ApKeyPatch:
-
- ; A1 = lScr, for debugging purposes
- movem.l A0-A1/D0-D1,-(SP)
-
- move.l ApOldKey,A0
- jsr (A0)
-
- clr.w D0
- move.b 0xFC02,D0
-
- cmpi.b #0x3F,D0 ; check F5
- bne Akp2
-
- move.l lEmul,A0
- move.w #OP_RTS,(A0) ; hit F5, so exit
- bra Akpexit
-
- Akp2:
- cmpi.b #0x44,D0 ; F10 key is SYSTEM RESET (always enabled)
- bra Akpexit
-
- nop
-
- Akpexit:
- movem.l (SP)+,A0-A1/D0-D1
- rts
-
- ApOldKey:
- dc.l 0
-
- mpSTtoAp:
- dc.w 0x8081, 0x8283, 0x8485, 0x8687, 0x8889, 0x8A8B, 0x8C8D, 0x8E8F
- dc.w 0x9091, 0x9293, 0x9495, 0x9697, 0x9899, 0x9A9B, 0x9C9D, 0x9E9F
- dc.w 0xA0A1, 0xA2A3, 0xA4A5, 0xA6A7, 0xA8A9, 0xAAAB, 0xACAD, 0xAEAF
- dc.w 0xB0B1, 0xB2B3, 0xB4B5, 0xB6B7, 0xB8B9, 0xBABB, 0xBCBD, 0xBEBF
- dc.w 0xC0C1, 0xC2C3, 0xC4C5, 0xC6C7, 0xC8C9, 0xCACB, 0xCCCD, 0xCECF
- dc.w 0xD0D1, 0xD2D3, 0xD4D5, 0xD6D7, 0xD8D9, 0xDADB, 0xDCDD, 0xDEDF
- dc.w 0xE0E1, 0xE2E3, 0xE4E5, 0xE6E7, 0xE8E9, 0xEAEB, 0xECED, 0xEEEF
- dc.w 0xF0F1, 0xF2F3, 0xF4F5, 0xF6F7, 0xF8F9, 0xFAFB, 0xFCFD, 0xFEFF
-
- ; add more assembler code here:
-
- }
- }
-
-